Spring Boot ক্লায়েন্ট তৈরি করার সময় Security, Error Handling, এবং Performance Optimization-এর দিকে মনোযোগ দেওয়া অত্যন্ত গুরুত্বপূর্ণ। নিচে প্রতিটি বিষয় নিয়ে কিছু টিপস দেওয়া হলো:
# Enable SSL in Spring Boot application.properties
server.port=8443
server.ssl.key-store=classpath:keystore.jks
server.ssl.key-store-password=your-password
server.ssl.keyStoreType=JKS
server.ssl.keyAlias=selfsigned
RestTemplate
বা WebClient
এর মাধ্যমে অ্যাক্সেস টোকেন সংগ্রহ করে ব্যবহার করুন।// Example: OAuth2 Token retrieval via RestTemplate
String accessToken = "your-access-token";
HttpHeaders headers = new HttpHeaders();
headers.setBearerAuth(accessToken);
HttpEntity<String> entity = new HttpEntity<>(headers);
# Use environment variables for storing API keys
api.key=${API_KEY}
// Disabling CSRF for Rest API (if needed)
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable(); // Only disable CSRF for REST APIs if absolutely necessary
}
}
@ControllerAdvice
@ControllerAdvice
ব্যবহার করে একটি সাধারণ Exception Handler তৈরি করুন যাতে সব ধরনের এক্সসেপশন এক জায়গায় হ্যান্ডল করা যায়।@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public ResponseEntity<Object> handleAllExceptions(Exception ex) {
ErrorResponse errorResponse = new ErrorResponse("ERROR", ex.getMessage());
return new ResponseEntity<>(errorResponse, HttpStatus.INTERNAL_SERVER_ERROR);
}
}
404 Not Found
, 400 Bad Request
ইত্যাদি হ্যান্ডল করুন।@ExceptionHandler(ResourceNotFoundException.class)
public ResponseEntity<Object> handleResourceNotFound(ResourceNotFoundException ex) {
ErrorResponse errorResponse = new ErrorResponse("NOT_FOUND", ex.getMessage());
return new ResponseEntity<>(errorResponse, HttpStatus.NOT_FOUND);
}
RestTemplate
and WebClient
Error HandlingRestTemplate
এবং WebClient
-এ কাস্টম Error Handler সেটআপ করুন।RestTemplate restTemplate = new RestTemplate();
restTemplate.setErrorHandler(new DefaultResponseErrorHandler() {
@Override
public void handleError(ClientHttpResponse response) throws IOException {
// Custom error handling logic
}
});
webClient.get()
.uri("/data")
.retrieve()
.onStatus(HttpStatus::is4xxClientError, response -> {
// Handle 4xx client errors
return Mono.error(new RuntimeException("Client Error"));
})
.onStatus(HttpStatus::is5xxServerError, response -> {
// Handle 5xx server errors
return Mono.error(new RuntimeException("Server Error"));
})
.bodyToMono(String.class);
public class ErrorResponse {
private String errorCode;
private String errorMessage;
// getters and setters
}
@Bean
public RestTemplate restTemplate() {
HttpClient httpClient = HttpClients.custom()
.setMaxConnTotal(200)
.setMaxConnPerRoute(20)
.build();
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClient);
return new RestTemplate(factory);
}
@Bean
public WebClient.Builder webClientBuilder(ReactiveClientHttpConnector connector) {
return WebClient.builder().clientConnector(connector);
}
@Bean
public ReactiveClientHttpConnector connector() {
return new ReactorClientHttpConnector(HttpClient.create()
.tcpConfiguration(tcpClient -> tcpClient.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000))
.wiretap(true));
}
@Bean
public CacheManager cacheManager() {
return new ConcurrentMapCacheManager("responses");
}
@Cacheable("responses")
public String fetchDataFromServer() {
// Make HTTP request
}
@Bean
public RestTemplate restTemplate() {
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
factory.setConnectTimeout(5000); // 5 seconds
factory.setReadTimeout(5000); // 5 seconds
return new RestTemplate(factory);
}
@Bean
public WebClient.Builder webClientBuilder() {
return WebClient.builder()
.baseUrl("https://api.example.com")
.clientConnector(new ReactorClientHttpConnector(HttpClient.create().responseTimeout(Duration.ofSeconds(5))));
}
Mono<String> result = webClient.get()
.uri("/data")
.retrieve()
.bodyToMono(String.class);
result.subscribe(response -> System.out.println(response));
এই টিপসগুলো অনুসরণ করলে আপনার Spring Boot ক্লায়েন্টের নিরাপত্তা, কার্যকারিতা এবং পারফরম্যান্স উন্নত হবে।